#ifndef SPROOUT_H
#define SPROOUT_H

/* 声明 */

struct Value;
enum Type;
struct Object;

typedef enum Type Type;
typedef struct Value Value;
typedef struct Object Object;
typedef struct Object Array;

/**
 * 1.Object 对象转化为 JSON 字符串
 *
 * @param obj Object 对象指针
 * @return JSON 字符串
 */
char *object_to_str(const Object *obj);

/**
 * 2.JSON 字符串转化为 Object 对象
 *
 * @param str JSON 字符串
 * @return Object 对象指针
 */
Object *str_to_object(const char *str);

/**
 * 3.Array 对象转化为 JSON 字符串
 *
 * @param obj Array 对象指针
 * @return JSON 字符串
 */
char *array_to_str(const Array *arr);

/**
 * 4.JSON 字符串转化为 Array 对象
 *
 * @param str JSON 字符串
 * @return Array 对象指针
 */
Array *str_to_array(const char *str);

/**
 * 5.JSON array [{}, []] 转化为 Array 对象
 *
 * @param str JSON 字符串
 * @return Array 对象指针
 */
Array *json_array_empty_to_c_array(const char *arr);

/**
 *  6.Array 对象转化为JSON array [{}, []]
 *
 * @param str Array 对象指针
 * @return JSON 字符串
 */
char *c_array_empty_to_json_array(const Array *arr);

/**
 * 7.JSON string "foo" 转化为 char *
 *
 * @param str JSON string "foo"
 * @return char *
 */
char *json_string_to_c_string(const char *str);

/**
 * 8.char * 转化为 JSON string "foo"
 *
 * @param str  char *
 * @return JSON string "foo"
 */
char *c_string_to_json_string(const char *str);

/**
 * 9.JSON array ["foo", "bar"] 转化为 Array 对象
 *
 * @param str  JSON array ["foo", "bar"]
 * @return Array 对象
 */
Array *json_array_to_c_array(const char *arr);

/**
 * 10.Array对象转化为JSON array ["foo", "bar"]
 *
 * @param str  Array 对象
 * @return JSON array ["foo", "bar"]
 *
 *
 */
Array *json_array_to_c_array(const char *arr);

/**
 * 11.JSON object {"object":{}, "array":[]} 转化为 Object 对象
 *
 * @param str  JSON array {"object":{}, "array":[]}
 * @return  Object 对象
 *
 */
Object *json_objcte_empty_to_c_object(const char *obj);

/**
 * 12.Object对象转化为 JSON object {"object":{}, "array":[]}
 *
 * @param str Object对象
 * @return JSON array {"object":{}, "array":[]}
 *
 */
char *c_object_empty_to_json_objcte(const Object *obj);

/**
 * 13.JSON object {"object":{"array":[{}, {}]}} 转化为 Object 对象
 * @param str JSON object {"object":{"array":[{}, {}]}}
 * @return Object 对象
 *
 */

/**
 * 14.Object对象转化为 JSON array {"object":{"array":[{}, {}]}}
 * @param str Object对象
 * @return JSON array {"object":{"array":[{}, {}]}}
 *
 *
 */

/* 定义 */

enum Type
{
    J_OBJECT = 1 << 3, // object
};

struct Value
{
    char *k;
    void *v;
    Type t;
};

struct Object
{
    Value *curr;
    Value *next;
};

/* 常量 */

#define LEFT_BRACE '{'
#define RIGHT_BRACE '}'
#define WHITESPACE ' '
#define LINEFEED '\n'
#define CARRIAGE_RETURN '\r'
#define HORIZONTAL_TAB '\t'
#define LEFT_BRACKET '['
#define RIGHT_BRACKET ']'

#endif
